<?php
/**
 * 发布/订阅模式 (Pub/Sub)
 * Redis 提供 PUBLISH 和 SUBSCRIBE 命令，可以实现消息的广播式发布和订阅。
 * 发布/订阅是一个即发即用的操作，消息不会在 Redis 的持久化存储中保存
 * 适合的场景  广播
 * 发布消息后
 * 1.所有已经订阅者 都能收到消息
 * 2.发布消息后,再订阅的订阅者 也收不到之前的消息
 * 缺点
 * 1. 发布订阅模式 不适合多进程处理数据,因为所有订阅者都能处理同一条消息
 * 2. 连接时间长 就出现读取超时异常
 *
基本流程
 * 发布者：向频道发布消息。
 * 订阅者：订阅频道并监听消息。
 * 添加数据 php mq/mqChannelList.php mq
 * 消费数据 php mq/mqChannelList.php
 * 消费数据 php mq/mqChannelList.php
 */

class MqList
{
    /**
     * 添加数据
     */
    static function mq($data = ['task_id' => 2, 'message' => 'Blocking Queue Example'])
    {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $data['task_id'] = date('YmdHis');
        $message = json_encode($data);
        $redis->publish('channel:news', $message);
        echo "Message published to channel.\n";
    }

    /**
     * 消费数据
     * subscribe() 会让程序一直等待新的消息
     *
     */
    static function server()
    {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis->subscribe(['channel:news'], function ($redis, $channel, $message) {
            echo "Received message from {$channel}: {$message}\n";
        });
    }
}

if ('mq' ==  ($argv[1] ?? '') ||  'php-fpm' == PHP_SAPI) {
    MqList::mq();
    return;
}

MqList::server();







